# -*- coding: UTF-8 -*-
from django.core import meta, validators

class Site(meta.Model):
    db_table = 'sites'
    fields = (
        meta.CharField('domain', 'nom de domaine', maxlength=100),
        meta.CharField('name', 'nom véritable', maxlength=50),
    )
    ordering = (('domain', 'ASC'),)

    def __repr__(self):
        return self.domain

    def _module_get_current():
        "Renvoie le site actuel, obtenu grâce à la constante SITE_ID."
        from django.conf.settings import SITE_ID
        return get_object(id__exact=SITE_ID)

class Package(meta.Model):
    db_table = 'packages'
    fields = (
        meta.CharField('label', 'étiquette', maxlength=20, primary_key=True),
        meta.CharField('name', 'nom', maxlength=30, unique=True),
    )
    ordering = (('name', 'ASC'),)

    def __repr__(self):
        return self.name

class ContentType(meta.Model):
    db_table = 'content_types'
    fields = (
        meta.CharField('name', 'nom', maxlength=100),
        meta.ForeignKey(Package, name='package'),
        meta.CharField('python_module_name', 'nom du module Python', maxlength=50),
    )
    ordering = (('package', 'ASC'), ('name', 'ASC'),)
    unique_together = (('package', 'python_module_name'),)

    def __repr__(self):
        return "%s | %s" % (self.package, self.name)

    def get_model_module(self):
        "Renvoie le module Python correspondant au modèle de données permettant de manipuler les objets du type de contenu actuel."
        return __import__('django.models.%s.%s' % (self.package, self.python_module_name), '', '', [''])

    def get_object_for_this_type(self, **kwargs):
        """
        Renvoie un objet dont le type est le type de contenu actuel; l'objet est
        recherché en fonction des arguments passés par mot-clé à cette fonction.
        En gros, cette méthode est un alias de la méthode get_object() du modèle
        de données correspondant au type de contenu actuel. L'exception
        ObjetNotExist ne sera pas interceptée si elle se déclenche, donc le code
        voulant appeler cette méthode devra se charger lui-même de l'interception
        de cette exception.
        """
        return self.get_model_module().get_object(**kwargs)

class Redirect(meta.Model):
    db_table = 'redirects'
    fields = (
        meta.ForeignKey(Site, radio_admin=meta.VERTICAL),
        meta.CharField('old_path', 'page à partir de laquelle doit se faire la redirection', maxlength=200, db_index=True,
            help_text="Ce champ est en général un chemin d'accès absolu, sans le nom de domaine. Exemple : '/evenements/rechercher/'."),
        meta.CharField('new_path', 'page vers laquelle doit se faire la redirection', maxlength=200, blank=True,
            help_text="Ce champ peut être soit un chemin d'accès absolu (comme ci-dessus) soit une URL complète commençant par 'http://'."),
    )
    unique_together=(('site_id', 'old_path'),)
    ordering = (('old_path', 'ASC'),)
    admin = meta.Admin(
        fields = (
            (None, {'fields': ('site_id', 'old_path', 'new_path')}),
        ),
        list_display = ('__repr__',),
        list_filter = ('site_id',),
        search_fields = ('old_path', 'new_path'),
    )

    def __repr__(self):
        return "%s ---> %s" % (self.old_path, self.new_path)

class FlatFile(meta.Model):
    db_table = 'flatfiles'
    fields = (
        meta.CharField('url', 'URL', maxlength=100, validator_list=[validators.isAlphaNumericURL],
            help_text="Exemple : '/apropos/contact/'. Assurez-vous d'inclure un slash au début et à la fin de l'URL."),
        meta.CharField('title', 'titre', maxlength=200),
        meta.TextField('content', 'contenu', help_text="Le code HTML est autorisé, sans restriction aucune."),
        meta.BooleanField('enable_comments', 'autoriser les commentaires?'),
        meta.CharField('template_name', 'nom du modèle', maxlength=70, blank=True,
            help_text="Exemple : 'flatfiles/page_de_contact'. Si ce champ n'est pas défini, le système utilisera 'flatfiles/default'."),
        meta.BooleanField('registration_required', 'inscription obligatoire',
            help_text="Si cette option est cochée, seuls les utilisateurs connectés seront à même de voir la page."),
        meta.ManyToManyField(Site),
    )
    ordering = (('url', 'ASC'),)
    admin = meta.Admin(
        fields = (
            (None, {'fields': ('url', 'title', 'content', 'sites')}),
            ('Options avancées', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}),
        ),
        list_filter = ('sites',),
        search_fields = ('url', 'title'),
    )

    def __repr__(self):
        return "%s -- %s" % (self.url, self.title)

    def get_absolute_url(self):
        return self.url
